package com.mexcad.reports;

import java.awt.Color;
import java.io.IOException;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperManager;
import net.sf.jasperreports.engine.JasperPrint;

import org.hibernate.Session;

import com.lowagie.text.Chunk;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.FontFactory;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;
import com.mexcad.db.connectors.ReportConnectors;
import com.mexcad.db.delegate.DelegateConnectors;
import com.mexcad.db.utils.HibernateUtil;
import com.mexcad.reports.utils.DataType;
import com.mexcad.reports.utils.DocumentsAdds;
import com.mexcad.reports.utils.PDFDocumentException;
import com.mexcad.reports.utils.PDFTable;
import com.mexcad.utils.Constantes;
import com.mexcad.utils.Formatter;
import java.sql.Timestamp;

public class ComisionesEsquemaReportServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private PdfWriter writer; 
	private String titulo="Comisiones";

	
		protected void doPost(HttpServletRequest req, HttpServletResponse res)
				throws ServletException, IOException {

			Integer mexcad= req.getParameter("mexcad")!=null?new Integer(req.getParameter("mexcad")):new Integer(0);
			Integer uno=req.getParameter("gerente")!=null?new Integer(req.getParameter("gerente")):new Integer(0);
			Integer dos=req.getParameter("acreedor")!=null?new Integer(req.getParameter("acreedor")):new Integer(0);
			
		
	
			
			Integer entregasParciales=req.getParameter("entregasParciales")!=null?new Integer(req.getParameter("entregasParciales")):new Integer(0);
			Integer especialFinal=req.getParameter("especialFinal")!=null?new Integer(req.getParameter("especialFinal")):new Integer(0);
			Integer normal=req.getParameter("normal")!=null?new Integer(req.getParameter("normal")):new Integer(0);
			Integer normaliva=req.getParameter("normaliva")!=null?new Integer(req.getParameter("normaliva")):new Integer(0);
			Integer unam=req.getParameter("unam")!=null?new Integer(req.getParameter("unam")):new Integer(0);
			Integer especial=req.getParameter("especial")!=null?new Integer(req.getParameter("especial")):new Integer(0);
			Integer unamIva=req.getParameter("unamIva")!=null?new Integer(req.getParameter("unamIva")):new Integer(0);
			
			
			try {
				Document doc =  new Document(PageSize._11X17.rotate(), 25, 25, 25, 50);
				writer=   PdfWriter.getInstance(doc, res.getOutputStream());
				writer.setViewerPreferences(PdfWriter.PageModeUseThumbs);
				writer.setLinearPageMode();
				writer.setPageEvent( new DocumentsAdds.MyPageEvents());
				
				DocumentsAdds.addMetaData(doc, "Documento Test");
				doc.open();
				
				String fechaIni= req.getParameter("fecha_ini");
				String fechaFin= req.getParameter("fecha_fin");
				PDFTable pdfTable=null;
				
				if(fechaIni != null && fechaFin!= null){

					
					DocumentsAdds.addSimpleHeader(doc, titulo, fechaIni, fechaFin);
					
					List<Object []> lista;
					lista =  ReportConnectors.getPagosByPeriodoForComisions(fechaIni,fechaFin);
					Map<Integer,String> mapClientes = ReportConnectors.getAllClientes();
				
					String []header =new String[]{"Sucursal", "Crédito","Fecha", "Pago","Intereses","Comisión Mexcad","Comer 1","Comer 2"};
					float []tamCols =new float[]{2.5f ,1f,1.5f, 1.5f, 1.5f, 1.5f, 1.5f , 1.5f   };
					List<DataType []> listadoDatos = new ArrayList<DataType []>();

					
						if( mapClientes!=null ){
			
							for(Iterator<Object[]> it = lista.iterator();it.hasNext();){
								Object[] obj = it.next();
								Integer esquema = (Integer)obj[9];
								
								if(esquema.intValue()==entregasParciales.intValue() || 
								   esquema.intValue()==especialFinal.intValue() || 
								   esquema.intValue()==normal.intValue() ||  
								   esquema.intValue()==normaliva.intValue() || 
								   esquema.intValue()==unam.intValue() ||  
								   esquema.intValue()==especial.intValue() || 
								   esquema.intValue()==unamIva.intValue() ){
								 
									DataType []datos = new DataType[header.length];
									
									 datos[0]= new DataType();
									 datos[0].setAlignMode(Element.ALIGN_CENTER);
									 datos[0].setData(mapClientes.get((Integer)obj[1]));
									 datos[0].setDataType(DataType.STRING_TYPE);
	
									 datos[1]= new DataType();
									 datos[1].setAlignMode(Element.ALIGN_LEFT);
									 datos[1].setData((Integer)obj[2]);
									 datos[1].setDataType(DataType.STRING_TYPE);
	
									 datos[2]= new DataType();
									 datos[2].setAlignMode(Element.ALIGN_CENTER);
									 datos[2].setData(Formatter.getStringFromDate((Date)obj[3]));
									 datos[2].setDataType(DataType.STRING_TYPE);
	
									 datos[3]= new DataType();
									 datos[3].setAlignMode(Element.ALIGN_CENTER);
									 datos[3].setData(((java.math.BigDecimal)obj[4]).doubleValue());
									 datos[3].setDataType(DataType.CURRENCY_TYPE);
	
									 datos[4]= new DataType();
									 datos[4].setAlignMode(Element.ALIGN_RIGHT);
									 datos[4].setData(((java.math.BigDecimal)obj[5]).doubleValue());
									 datos[4].setDataType(DataType.CURRENCY_TYPE);
	
									 if(mexcad==1 && uno ==1 && dos ==1){ //los tres
											
										 double intereses = ((java.math.BigDecimal)obj[5]).doubleValue();
										 double comision=((java.math.BigDecimal)obj[6]).doubleValue()/100;
		
										 datos[5]= new DataType();
										 datos[5].setAlignMode(Element.ALIGN_RIGHT);
										 datos[5].setData(intereses*comision);
										 datos[5].setDataType(DataType.CURRENCY_TYPE);
		
										 comision=((java.math.BigDecimal)obj[7]).doubleValue()/100;
		
										 datos[6]= new DataType();
										 datos[6].setAlignMode(Element.ALIGN_RIGHT);
										 datos[6].setData(intereses*comision);
										 datos[6].setDataType(DataType.CURRENCY_TYPE);
		
										 comision=((java.math.BigDecimal)obj[8]).doubleValue()/100;
		
										 datos[7]= new DataType();
										 datos[7].setAlignMode(Element.ALIGN_RIGHT);
										 datos[7].setData(intereses*comision);
										 datos[7].setDataType(DataType.CURRENCY_TYPE);
									 }else if(mexcad==1 && uno ==1 ){
										 double intereses = ((java.math.BigDecimal)obj[5]).doubleValue();
										 double comision=((java.math.BigDecimal)obj[6]).doubleValue()/100;
		
										 datos[5]= new DataType();
										 datos[5].setAlignMode(Element.ALIGN_RIGHT);
										 datos[5].setData(intereses*comision);
										 datos[5].setDataType(DataType.CURRENCY_TYPE);
		
										 comision=((java.math.BigDecimal)obj[7]).doubleValue()/100;
		
										 datos[6]= new DataType();
										 datos[6].setAlignMode(Element.ALIGN_RIGHT);
										 datos[6].setData(intereses*comision);
										 datos[6].setDataType(DataType.CURRENCY_TYPE);
		
										 comision=((java.math.BigDecimal)obj[8]).doubleValue()/100;
		
										 datos[7]= new DataType();
										 datos[7].setAlignMode(Element.ALIGN_RIGHT);
										 datos[7].setData(0.0);
										 datos[7].setDataType(DataType.CURRENCY_TYPE);
		
									 }else if(mexcad==1 && dos ==1 ){ 
										 double intereses = ((java.math.BigDecimal)obj[5]).doubleValue();
										 double comision=((java.math.BigDecimal)obj[6]).doubleValue()/100;
		
										 datos[5]= new DataType();
										 datos[5].setAlignMode(Element.ALIGN_RIGHT);
										 datos[5].setData(intereses*comision);
										 datos[5].setDataType(DataType.CURRENCY_TYPE);
		
										 comision=((java.math.BigDecimal)obj[7]).doubleValue()/100;
		
										 datos[6]= new DataType();
										 datos[6].setAlignMode(Element.ALIGN_RIGHT);
										 datos[6].setData(0.0);
										 datos[6].setDataType(DataType.CURRENCY_TYPE);
		
										 comision=((java.math.BigDecimal)obj[8]).doubleValue()/100;
		
										 datos[7]= new DataType();
										 datos[7].setAlignMode(Element.ALIGN_RIGHT);
										 datos[7].setData(intereses*comision);
										 datos[7].setDataType(DataType.CURRENCY_TYPE);
									 }else if(uno==1 && dos ==1 ){
										 double intereses = ((java.math.BigDecimal)obj[5]).doubleValue();
										 double comision=((java.math.BigDecimal)obj[6]).doubleValue()/100;
		
										 datos[5]= new DataType();
										 datos[5].setAlignMode(Element.ALIGN_RIGHT);
										 datos[5].setData(0.0);
										 datos[5].setDataType(DataType.CURRENCY_TYPE);
		
										 comision=((java.math.BigDecimal)obj[7]).doubleValue()/100;
		
										 datos[6]= new DataType();
										 datos[6].setAlignMode(Element.ALIGN_RIGHT);
										 datos[6].setData(intereses*comision);
										 datos[6].setDataType(DataType.CURRENCY_TYPE);
		
										 comision=((java.math.BigDecimal)obj[8]).doubleValue()/100;
		
										 datos[7]= new DataType();
										 datos[7].setAlignMode(Element.ALIGN_RIGHT);
										 datos[7].setData(intereses*comision);
										 datos[7].setDataType(DataType.CURRENCY_TYPE);
									 }else if(mexcad==1){ 
										 double intereses = ((java.math.BigDecimal)obj[5]).doubleValue();
										 double comision=((java.math.BigDecimal)obj[6]).doubleValue()/100;
		
										 datos[5]= new DataType();
										 datos[5].setAlignMode(Element.ALIGN_RIGHT);
										 datos[5].setData(intereses*comision);
										 datos[5].setDataType(DataType.CURRENCY_TYPE);
		
										 datos[6]= new DataType();
										 datos[6].setAlignMode(Element.ALIGN_RIGHT);
										 datos[6].setData(0.0);
										 datos[6].setDataType(DataType.CURRENCY_TYPE);
		
										 datos[7]= new DataType();
										 datos[7].setAlignMode(Element.ALIGN_RIGHT);
										 datos[7].setData(0.0);
										 datos[7].setDataType(DataType.CURRENCY_TYPE);
		
									 }else if(uno==1){ 
										 double intereses = ((java.math.BigDecimal)obj[5]).doubleValue();
										 double comision=((java.math.BigDecimal)obj[6]).doubleValue()/100;
		
										 datos[5]= new DataType();
										 datos[5].setAlignMode(Element.ALIGN_RIGHT);
										 datos[5].setData(0.0);
										 datos[5].setDataType(DataType.CURRENCY_TYPE);
		
										 comision=((java.math.BigDecimal)obj[7]).doubleValue()/100;
		
										 datos[6]= new DataType();
										 datos[6].setAlignMode(Element.ALIGN_RIGHT);
										 datos[6].setData(intereses*comision);
										 datos[6].setDataType(DataType.CURRENCY_TYPE);
		
										 datos[7]= new DataType();
										 datos[7].setAlignMode(Element.ALIGN_RIGHT);
										 datos[7].setData(0.0);
										 datos[7].setDataType(DataType.CURRENCY_TYPE);
		
									 }else if(dos==1){ 
										 double intereses = ((java.math.BigDecimal)obj[5]).doubleValue();
										 double comision=((java.math.BigDecimal)obj[6]).doubleValue()/100;
		
										 datos[5]= new DataType();
										 datos[5].setAlignMode(Element.ALIGN_RIGHT);
										 datos[5].setData(0.0);
										 datos[5].setDataType(DataType.CURRENCY_TYPE);
		
		
										 datos[6]= new DataType();
										 datos[6].setAlignMode(Element.ALIGN_RIGHT);
										 datos[6].setData(0.0);
										 datos[6].setDataType(DataType.CURRENCY_TYPE);
		
										 comision=((java.math.BigDecimal)obj[8]).doubleValue()/100;
		
										 datos[7]= new DataType();
										 datos[7].setAlignMode(Element.ALIGN_RIGHT);
										 datos[7].setData(intereses*comision);
										 datos[7].setDataType(DataType.CURRENCY_TYPE);
									 }else{
										 double intereses = ((java.math.BigDecimal)obj[5]).doubleValue();
										 double comision=((java.math.BigDecimal)obj[6]).doubleValue()/100;
		
										 datos[5]= new DataType();
										 datos[5].setAlignMode(Element.ALIGN_RIGHT);
										 datos[5].setData(intereses*comision);
										 datos[5].setDataType(DataType.CURRENCY_TYPE);
		
										 comision=((java.math.BigDecimal)obj[7]).doubleValue()/100;
		
										 datos[6]= new DataType();
										 datos[6].setAlignMode(Element.ALIGN_RIGHT);
										 datos[6].setData(intereses*comision);
										 datos[6].setDataType(DataType.CURRENCY_TYPE);
		
										 comision=((java.math.BigDecimal)obj[8]).doubleValue()/100;
		
										 datos[7]= new DataType();
										 datos[7].setAlignMode(Element.ALIGN_RIGHT);
										 datos[7].setData(intereses*comision);
										 datos[7].setDataType(DataType.CURRENCY_TYPE);
		
									 }
								 
								 listadoDatos.add(datos);					
									
							  }
							}
							
							pdfTable = new PDFTable(tamCols,header,listadoDatos);
							doc.add(pdfTable.getTable());
						}
					
					
					
				}else{
					Paragraph p = new Paragraph("Error al generar el documento",FontFactory.getFont(FontFactory.COURIER, 28, Font.BOLD, new Color(0, 0, 0)));
					doc.add(p);
				}
				
				doc.add (Chunk.NEWLINE);
				doc.add (Chunk.NEWLINE);
				doc.close();
				
			} catch (DocumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (PDFDocumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
			

			
		}

		protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1)
				throws ServletException, IOException {
			doPost(arg0, arg1);
		}
}

